package com.servitware.cardio.dokstat.transport;

import java.net.URL;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.web.client.RestTemplate;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.servitware.cardio.dokstat.transport.sabino.AdapterSolicitud;
import com.servitware.cardio.dokstat.transport.sabino.SabinoSolicitud;
import com.servitware.cardio.dokstat.transport.sabino.SabinoTransportSolicitud;
import com.servitware.cardio.domain.transport.SolicitudTx;

/**
 * 2014-01-30 Andres Ledesma
 * ---------------------------------------------------- SessionDownloader.java
 * --------------------------------------------------
 * 
 * 
 * 
 * Consume el WS que entrga listado de solicitudes con sesion lista para
 * procesar
 * 
 * Hace una peticion REST y recibe una Lista de >Solicitud>
 * 
 * Consume desde <cardiorunning.com> - y desde <servitware.org/cardio>
 * 
 */

public class SolicitudDownloader
{
	private Logger logger = Logger.getLogger(SolicitudDownloader.class);

	private CardioWebApp webApp;

	public SolicitudDownloader(CardioWebApp webApp)
	{
		super();
		this.webApp = webApp;
	}

	// /**
	// * Lee solicitudes como instancias de <SolicitudTx> Es una instancia de
	// * transporte de <Solicitud>
	// *
	// * @return instancia de TranportSolicitud, contiene lista de <SesionTx>
	// */
	// private List<SolicitudTx> getSolicitudObjetos()
	// {
	// RestTemplate restTemplate = new RestTemplate();
	// TransportSolicitud ts = null;
	// try
	// {
	// ts = restTemplate.getForObject(url.getGetSolicitudesDescargar(),
	// TransportSolicitud.class);
	// logger.info("\n--DownloadsMng -> SolicitudDownloader: url ->  " +
	// url.getGetSolicitudesDescargar().toString());
	//
	// if (ts != null)
	// logger.info("\n--TransportSolicitud ts -> tiene " + ts.getList().size() +
	// " solicitudes!");
	//
	// }
	// catch (Exception e)
	// {
	// logger.info("\n--Error adquiriendo TransportSolicitud: url ->  " +
	// e.getMessage());
	// ts = null;
	// }
	//
	// if (ts != null)
	// return ts.getList();
	//
	// return null;
	// }

	/**
	 * Lee solicitudes iniciales que devuelve app inicial de cardiorunning, como
	 * SabinoSolicitud Es una instancia de transporte, de SabinoSolicitud
	 * 
	 * En version 1 de CR, existe version Joomla de Sabino, que escupe un
	 * paquete de variables sin estructura.
	 * 
	 * @return SabinoTransportSolicitud, contiene lista de SabinoSolicitud
	 */
	private List<SabinoSolicitud> _getSolicitudesADescargar()
	{
		SabinoTransportSolicitud sts;
		try
		{
			String url = webApp._gerURL_GET_SolicitudesADescargar();
			logger.info("\n--DownloadsMng -> SolicitudDownloader: url ->  " + url);

			ObjectMapper mapper = new ObjectMapper();
			//RestURL.trustSelfSignedSSL();
			mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
			sts = mapper.readValue(new URL(webApp._gerURL_GET_SolicitudesADescargar()), SabinoTransportSolicitud.class);
		}
		catch (Exception e)
		{
			sts = null;
			logger.info("\n--DownloadsMng -> SolicitudDownloader: Error: " + e.getMessage());

		}

		if (sts != null)
			return sts.getSesiones();

		return null;
	}

	/**
	 * Retorna la lista de instancias de transporte de Solicitud
	 * 
	 * @param tipo
	 *            parametro para decidir de donde leer la lista, de que servidor
	 *            en version 1 de CR, existe version Joomla de Sabino, que
	 *            escupe un paquete de variables sin estructura.
	 * 
	 *            - 0 lee seesiones de CR, version Sabino con Joomla - 1 lee
	 *            solicitudes de CR, en instancia de SolicitudTx <>----
	 *            ClienteTx <>---- SesionTx
	 * 
	 * @return
	 */
	public List<SolicitudTx> getListaSolicitudesADescargar()
	{

		try
		{
			return AdapterSolicitud.getListaSolicitudFromListaSesionSabino(_getSolicitudesADescargar());
		}
		catch (Exception e)
		{
			return null;
		}

	}

//	private List<Integer> extraeListaIntegerIdSolicitudTx(List<SolicitudTx> lst)
//	{
//		List<Integer> ints = new ArrayList<Integer>();
//
//		for (SolicitudTx s : lst)
//			ints.add(new Integer(s.getSesionTx().getId()));
//
//		return ints;
//	}
		
	/**
	 * Usada internamente Extrae id de sesiones en la lista, y creas un String
	 * de id, separados por coma e.g. 1024,1048,
	 * 
	 * @param lst
	 * 
	 * @return
	 */
	public String extraeListaIdSolicitudTx(List<SolicitudTx> lst)
	{
		
		if( lst == null )
			return "";
		
		StringBuilder ids = new StringBuilder();
		
		int i = 1; 
		
		for (SolicitudTx s : lst)
		{
			ids.append( s.getId() );
			if( i++ < lst.size() )
				ids.append(",");
		}

		return ids.toString();
	}

	
	
	/**
	 * Envia al servidor lista de solicitudes con sus sesiones descargadas.
	 */
	public String updateSolicitudesStatusDescargadas(List<SolicitudTx> lst)
	{
		if ((lst == null) || (lst.size() < 1))
			return null;

		String s = null;
		RestTemplate restTemplate = new RestTemplate();
		//RestURL.trustSelfSignedSSL();
		try
		{
			s = restTemplate.getForObject( webApp._gerURL_UPDATE_StatusSolicitudesDescargadas() + extraeListaIdSolicitudTx(lst), String.class);
		}
		catch (Exception e)
		{

		}

		return s;
	}

}
